package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	x      int64
	lock   sync.Mutex
	rwLock sync.RWMutex
	wg     sync.WaitGroup
)

// 读写锁 读锁共享 写锁独占
// 读锁，当一个 goroutine 获得读锁，其他可以获锁，如果是写
func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go write()
	}

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go read()
	}
	end := time.Now()
	fmt.Println("实际耗时：", end.Sub(start))
}

func write() {
	lock.Lock() // 互斥锁
	//rwLock.Lock()                // 加读写锁
	time.Sleep(time.Millisecond) // 假设写操作耗时1毫秒
	//rwLock.Unlock()              // 解读锁
	lock.Unlock() // 解互斥锁
	wg.Done()
}

func read() {
	lock.Lock() // 加互斥锁
	//rwLock.Lock() // 加写锁
	x = x + 1
	time.Sleep(10 * time.Millisecond) // 假设读操作耗时10毫秒
	//rwLock.Unlock()                   // 解写锁
	lock.Unlock() // 解互斥锁
	wg.Done()
}
